
package com.jf.cloud.user.mapper;

import com.jf.cloud.api.payment.vo.ShopAccountDetailVO;
import com.jf.cloud.api.user.dto.FinanceDetailDTO;
import com.jf.cloud.api.user.vo.FinanceDetailVO;
import com.jf.cloud.api.user.vo.UserPayInfoVO;
import com.jf.cloud.user.dto.UserLevelLogDTO;
import com.jf.cloud.user.model.UserLevelLog;
import com.jf.cloud.user.vo.UserLevelLogVO;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * 用户等级记录
 *
 * @author zz
 * @date 2021-05-14 11:04:52
 */
public interface UserLevelLogMapper {

    /**
     * 获取用户等级记录列表
     *
     * @return 用户等级记录列表
     */
    List<UserLevelLogVO> pageBuyLevelLog(@Param("userLevelLogDTO") UserLevelLogDTO userLevelLogDTO);

    /**
     * 根据用户等级记录id获取用户等级记录
     *
     * @param levelLogId 用户等级记录id
     * @return 用户等级记录
     */
    UserLevelLog getByLevelLogId(@Param("levelLogId") Long levelLogId);

    /**
     * 保存用户等级记录
     *
     * @param userLevelLog 用户等级记录
     */
    void save(@Param("userLevelLog") UserLevelLog userLevelLog);

    /**
     * 更新用户等级记录
     *
     * @param userLevelLog 用户等级记录
     */
    void update(@Param("userLevelLog") UserLevelLog userLevelLog);

    /**
     * 根据用户等级记录id删除用户等级记录
     *
     * @param levelLogId
     */
    void deleteById(@Param("levelLogId") Long levelLogId);

    /**
     * 更新为支付成功状态
     *
     * @param levelLogId 日志id
     * @param payId      支付id
     * @param payType 支付类型
     * @return 影响行数
     */
    int updateToSuccess(@Param("levelLogId") Long levelLogId, @Param("payId") Long payId, @Param("payType") Integer payType);

    /**
     * 批量保存用户等级变更日志
     *
     * @param userLevelLogs 保存日志列表
     * @return 影响行数
     */
    int batchSaveUserLevelLogs(@Param("userLevelLogs") List<UserLevelLog> userLevelLogs);

    /**
     * 根据开始结束时间及支付状态，筛选用户
     *
     * @param isPayed   是否支付
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @return 用户id列表
     */
    List<Long> listUserIdByEarliestRechargeTime(@Param("isPayed") Integer isPayed,
                                                @Param("startDate") Date startDate,
                                                @Param("endDate") Date endDate);

    /**
     * 获取用户最高的等级（普通会员）
     *
     * @param userId 用户id
     * @return 用户等级
     */
    Integer getMaxLevelByUserId(@Param("userId") Long userId);

    /**
     * 获取指定时间内的用户类型
     *
     * @param userId
     * @param createTime
     */
    Integer getUserTypeAtTime(@Param("userId") Long userId, @Param("createTime") Date createTime);


    /**
     * 删除用户等级记录
     * @param userId 用户id
     * @return
     */
    void deleteByUserId(@Param("userId") Long userId);

    /**
     * 获取财务详情列表
     * @param financeDetailDTO
     * @return
     */
    List<FinanceDetailVO> listFinanceDetail(@Param("financeDetailsParam") FinanceDetailDTO financeDetailDTO);

    /**
     * 获取平台财务信息
     * @param startTime
     * @param endTime
     * @return
     */
    ShopAccountDetailVO getPlatformAccountDetail(@Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 获取购买会员财务信息
     * @param startTime
     * @param endTime
     * @return
     */
    List<UserPayInfoVO> listPayInfo(@Param("startTime") Date startTime, @Param("endTime") Date endTime);
}
